package middleware

import (
	"log"
	"net/http"
	"time"
)

// loggingMiddleware 是一个中间件函数，用于记录请求日志
func Log(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// 记录请求开始时间
		start := time.Now()

		// 创建一个自定义的响应写入器，用于记录响应状态码
		lw := &loggingResponseWriter{ResponseWriter: w, statusCode: http.StatusOK}

		// 调用下一个处理程序
		next.ServeHTTP(lw, r)

		// 记录请求信息，包括方法、路径、状态码和处理时间
		log.Printf(
			"%s %s %d %v",
			r.Method,
			r.URL.Path,
			lw.statusCode,
			time.Since(start),
		)
	}
}

// loggingResponseWriter 是一个自定义的响应写入器，用于记录响应状态码
type loggingResponseWriter struct {
	http.ResponseWriter
	statusCode int
}

// WriteHeader 重写了 http.ResponseWriter 的 WriteHeader 方法，用于记录状态码
func (lrw *loggingResponseWriter) WriteHeader(code int) {
	lrw.statusCode = code
	lrw.ResponseWriter.WriteHeader(code)
}
